#include "drv_adc.h"
uint16_t adc_buf[100]={0};
void drv_adc_init(void)
{
		GPIO_InitTypeDef  GPIO_InitStruct;
		DMA_InitTypeDef  DMA_InitStruct;
		ADC_InitTypeDef  ADC_InitStruct;
		ADC_CommonInitTypeDef  ADC_CommonInitStruct;
		RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
		RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
		GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
		GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
		GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
		GPIO_Init(GPIOB, &GPIO_InitStruct);

		ADC_CommonInitStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
		ADC_CommonInitStruct.ADC_Mode = ADC_Mode_Independent;
		ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div4;
		ADC_CommonInitStruct.ADC_TwoSamplingDelay =ADC_TwoSamplingDelay_5Cycles;
		ADC_CommonInit(&ADC_CommonInitStruct);

		ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
		ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
		ADC_InitStruct.ADC_ExternalTrigConvEdge= ADC_ExternalTrigConvEdge_None;
		ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
		ADC_InitStruct.ADC_ScanConvMode = DISABLE;

		ADC_Init(ADC1, & ADC_InitStruct);

        DMA_InitStruct.DMA_BufferSize = 100;
		DMA_InitStruct.DMA_Channel =DMA_Channel_0;
		DMA_InitStruct.DMA_DIR = DMA_DIR_MemoryToMemory;
		DMA_InitStruct.DMA_FIFOMode=DMA_FIFOMode_Disable;
		DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)adc_buf;
		DMA_InitStruct.DMA_MemoryBurst = DMA_MemoryBurst_Single;
		DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
		DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
		DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
	
		DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
		DMA_InitStruct.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
		DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
		DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
		DMA_InitStruct.DMA_Priority = DMA_Priority_High;
		DMA_Init(DMA2_Stream0, &DMA_InitStruct);
	    ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 1,  ADC_SampleTime_84Cycles);
		ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
  	    ADC_Cmd(ADC1, ENABLE);
  	    DMA_Cmd( DMA2_Stream0,ENABLE );
		ADC_DMACmd(ADC1, ENABLE);
	    ADC_SoftwareStartConv( ADC1);

	
}

uint16_t drv_adc_value(void)
{	
	uint16_t ret;
	uint8_t i=0;
	uint32_t sum=0;
	for(i=0;i<100;i++)
	{
		sum+=adc_buf[i];
	}
	 ret = (uint16_t)(sum/100);
	return ret;
}

